﻿// using UnityEngine;
// using System.Collections;
// using System.Collections.Generic;
// using TTGame;
// using System;
//
// /*
//  * BattleManager
//  * 战斗管理类
//  *
//  * 切关时会删除。
//  *
//  *
//  *
//  * 依赖：
//  * BattleData
//  *
//  * ！不写重复代码！
//  * @author TTun
//  * @date 7/14/2017 2:17:38 PM
//  */
// namespace TTGameEngine {
//
// public class BattleManager : MonoBehaviour {
//     enum BattleState {
//         NoStart,
//         Running,
//         Lose,
//         Win
//     }
//     static BattleManager m_instance;
//     Transform BattleObjRoot;
//
//     [SerializeField]
//     CameraControl sceneCameraCtrl;
//     [SerializeField]
//     GameObject objCamera;
//     [SerializeField]
//     Camera fpsCamera;
//     [SerializeField]
//     GameObject blackBG;
//     [SerializeField]
//     Vector3 fpsCameraOffsetPos;
//
//     public BattleData m_battleConfig;
//     [SerializeField, ReadOnly]
//     BattleField m_curField;
//     public bool IsBattlePause;
//     bool isBattleRunning = false;
//     //HeroObjs的顺序是头像的排序，头像排序的队列用的多一些。进入战斗时服务器下发数据，此时有一个顺序DataIdx。然后排序得到【英雄头像顺序】和【战斗位置顺序】。是不是很复杂？
//     List<Puppet> m_heroObjs = new List<Puppet>();
//     //按照场景里战斗位置的顺序。仅仅是站位排序时用到。
//     List<Puppet> m_heroObjsBySeat = new List<Puppet>();
//     List<Puppet> m_enemyObjs = new List<Puppet>();
//     BattleState battleState = BattleState.NoStart;
//
//     int maxFieldCount = 0;
//     Transform m_curFieldTF;
//     [SerializeField, ReadOnly]
//     int curFieldIdx = 0;
//     bool IsBattleOverCheck = false;
//     float CheckBattleOverSendServerTime = 5f;
//     #region 场景移动
//     bool isCameraToNextField = false;
//     bool isObjMovingToNextField = false;
//     float t_progress = 0;
//     Vector3 lastFieldCenterPos;
//     Vector3 nextFieldCenterPos;
//     [SerializeField, ReadOnly]
//     MoveInfo fieldMoveInfo;
//     #endregion
//
//     #region 大招技能
//     bool isSkillEnable = false;
//     bool IsSkillEffect = false;
//     [SerializeField, ReadOnly]
//     Puppet _effectSkillCaster;
//     uint _effectSkillCastID = 0; //当前展现效果的技能CastID
//     //int _skillDmgType = 0;
//     [SerializeField]
//     float SkillFreezingTime = 0.5f;
//     public bool isDuringRequestingBattleInfo = false;
//     bool tIsAllEnemyDead = false;
//     #endregion
//
//     #region FPS模式
//     bool IsFPSMode = false;
//     public Puppet FPSCaster = null;
//     Ray ray;
//     Vector3 touchHitPos;
//     //攻击时间间隔
//     [SerializeField, ReadOnly]
//     public float fpsAtkCD;
//     //fps模式持续事件
//     [SerializeField, ReadOnly]
//     public float fpsTime;
//     int fpsSkillID;
//     uint fpsSkillCastID;
//     float t_fpsTime;
//     float t_fpsAtkCD;
//     //unuse
//     List<int> m_buffIDs = new List<int>();
//     [SerializeField, ReadOnly]
//     string fpsBulletTag;
//     [SerializeField, ReadOnly]
//     string fpsManPrefab;
//     [SerializeField, ReadOnly]
//     Vector3 fpsModelOffset;
//     [SerializeField, ReadOnly]
//     string fpsMuzzleEffectPrefab;
//     [SerializeField, ReadOnly]
//     string fpsAttackStandAnimName;
//     [SerializeField, ReadOnly]
//     string fpsAttackAnimName;
//     [SerializeField, ReadOnly]
//     public float fpsMaxAttackShowTime = 0.2f;
//     Transform m_fpsEffectTF;
//     AnimPlayer m_fpsManAnimPlayer;
//     Transform m_fpsModelTF;
//     float t_fpsAttackShowTime;
//     #endregion
//
//     #region 战斗加速
//     int m_battleSpeed = 1;
//     public int MaxBattleSpeed = 2;
//     #endregion
//
//     public int CurFieldIdx {
//         get { return curFieldIdx; }
//     }
//
//     public int MaxFieldCount {
//         get { return maxFieldCount; }
//     }
//
//     //注：列表内某元素有可能为null。
//     public List<Puppet> HeroObjs {
//         get { return m_heroObjs; }
//     }
//     //注：列表内某元素有可能为null。
//     public List<Puppet> HeroObjsOrderByHeadIcon {
//         get { return m_heroObjs; }
//     }
//     //注：列表内某元素有可能为null。
//     public List<Puppet> EnemyObjs {
//         get { return m_enemyObjs; }
//     }
//
//     public static BattleManager Share() {
// //         if(m_instance == null) {
// //             GameObject obj = new GameObject("BattleManager");
// //             m_instance = obj.AddComponent<BattleManager>();
// //             m_instance.isDuringRequestingBattleInfo = false;
// //             m_instance.init();
// //         }
//         if(m_instance == null) {
//             DebugUtil.Log("BattleManager Not Init");
//         }
//         return m_instance;
//     }
//
//     void Awake() {
//         DebugUtil.Log("BattleManager Awake");
//         m_instance = this;
//         init();
//     }
//
//     public void OnDestory() {
//         DebugUtil.Log("BattleManager OnDestory");
//         m_instance = null;
//     }
//
//     void init() {
//         fpsBulletTag = "bullet";
//         isDuringRequestingBattleInfo = false;
//         guidePauseIndex = 0;
//     }
//
//     System.Diagnostics.Stopwatch watcher = new System.Diagnostics.Stopwatch();
// //     float showLoadingProgress = 0.5f;
// //     float targetLoadingProgress = 0f;
// //     Loading2View loadingView = null;
//
//     public void InitBattle() {
// //         loadingView = UGUIManager.GetInstance().GetGameFormScript<Loading2View>(FormID.FormID_Loading2);
// //         showLoadingProgress = 0.5f;
// //
// //         targetLoadingProgress = 0.9f;
//         if(DebugSetting.Self.Debug_LocalScene == false) {
//             PreInstantiated();
//         }
//
//         //系统对象和数据初始化
//         BuffManager.Share().LoadFromServerData();
//
//         //场景初始化
//         initBattle();
//         setupFirstField();
//
//         if(SceneManager.Share().curSceneID == 7010000) {
//             UGUIManager.GetInstance().HideForm(FormID.FormID_GuideCg); ;
//         }
//
//         //人物初始化
//         setupBattleObjs();
//         //loadingView = null;
//         DebugUtil.LogFormat("[BattleManager] InitBattle");
//     }
//
// //进入战斗
//     public void StartBattle() {
//         StartField();
//         //initGuides();
//         DebugUtil.LogFormat("[BattleManager] StartBattle");
//
//         battleState = BattleState.Running;
//         isBattleRunning = true;
//         tIsAllEnemyDead = false;
//
//     }
//
//     void DumpDebugTime() {
//         string preLoadList = "";
//         foreach(ObjectRecycler.InstantiatedPrefab initInfo in preInstantiatedObj.Values) {
//             preLoadList += string.Format("{0} / {1}\n", initInfo.thePrefab, initInfo.InitialCount);
//         }
//         DebugUtil.LogFormat("*** ProloadPrefabList ***\n{0}", preLoadList);
//         //DebugTime.Ins.Dump();
//     }
//
//     public void ExitBattle(Action beforeOverCall = null, Action loadOverCall = null) {
//         StopBattle();
//         //if(SceneManager.Share().curSceneID != 7010000)
//         var async = UnityEngine.SceneManagement.SceneManager.LoadSceneAsync("EmptyScene");
//         Loading2View.OpenLoad2(async, loadOverCall, beforeOverCall);
//         UGUIManager.GetInstance().HideForm(FormID.FormID_Battle);
//         UGUIManager.GetInstance().destoryForm(FormID.FormID_VictoryView);
//         UGUIManager.GetInstance().destoryForm(FormID.FormID_LostView);
//         OnBattleExit();
//     }
//
//     void OnBattleExit() {
//         OnDestory();
//     }
//
//     public void InitAfterBattleUIOK() {
//         //设置人物框框。
//         UGUIBattleForm.getInstance().InitAfterUIOK();
//
//         //添加对象血条。
//         setupShowHeroHP();
//         setupShowEnemyHP();
//
//         for(int i = 0; i < m_heroObjs.Count; i++) {
//             Puppet hero = m_heroObjs[i];
//             if(hero != null) {
//                 if(DebugSetting.Self.HeroFullAnger) {
//                     hero.CurAnger = hero.MaxAnger;
//                 }
//                 int maxAnger = hero.GetPropWithBuff(PuppetIntPropID.Prop_angerMax);
//                 if(maxAnger <= 0) maxAnger = 1;
//                 UGUIBattleForm.getInstance().SetHeroCellProgress(i,
//                         hero.GetPropWithBuff(PuppetIntPropID.Prop_curAnger) / (float)maxAnger);
//             }
//         }
//     }
//
//     void setupShowHeroHP() {
//         if(m_heroObjs != null) {
//             for(int i = 0; i < m_heroObjs.Count; i++) {
//                 if(m_heroObjs[i] != null && m_heroObjs[i].IsDead == false) {
//                     UGUIBattleForm.getInstance().ShowBlood(m_heroObjs[i]);
//                 }
//             }
//         }
//     }
//
//     void setupShowEnemyHP() {
//         if(m_enemyObjs != null) {
//             for(int i = 0; i < m_enemyObjs.Count; i++) {
//                 if(m_enemyObjs[i] != null && m_enemyObjs[i].IsDead == false) {
//                     UGUIBattleForm.getInstance().ShowBlood(m_enemyObjs[i]);
//                 }
//             }
//         }
//     }
//
//     /// <summary>
//     /// 进入战斗场景步骤：
//     /// 1、发<进入战斗>协议
//     /// 2、接收数据
//     /// 3、初始场景和新建对象
//     /// 4、开始战斗
//     /// </summary>
// //     public void EnterBattle(string sceneName) {
// //         UnityEngine.SceneManagement.SceneManager.LoadScene(sceneName);
// //     }
//
//     //先有BattleManager，后有UI。所以，不能在BattleManager初始化中调用UI。UI相关的初始化，放在UI里面。
//     void initBattle() {
//         m_curFieldTF = new GameObject("FieldCenter").transform;
// #if UNITY_EDITOR
//         if(DebugSetting.Self.Debug_LocalScene) {
//             maxFieldCount = m_battleConfig.GetFieldCount();
//         } else
// #endif
//         {
//             int localFieldDataCount = m_battleConfig.GetFieldCount();
//             int serverMonsterWaveCount = BattleServerData.Share().monsterSDatas.monsterWaves.Count;
//             maxFieldCount = Mathf.Min(localFieldDataCount, serverMonsterWaveCount);
//         }
//         //设置战斗位置
//         BattleObjRoot = new GameObject("BattleObjRoot").transform;
//         //设置天空盒
//         sceneCameraCtrl.m_camera.clearFlags = CameraClearFlags.SolidColor;
//         fpsCamera.clearFlags = CameraClearFlags.Skybox;
//     }
//
//     public CameraControl GetSceneCameraCtrl() {
//         return sceneCameraCtrl;
//     }
//
//     void setupFirstField() {
//         if(m_battleConfig.HasInitField()) {
//             curFieldIdx = -1;
//         } else {
//             curFieldIdx = 0;
//         }
//         m_curField = m_battleConfig.GetField(curFieldIdx);
//         if(curFieldIdx <= 0) {
//             m_curFieldTF.transform.position = m_curField.fieldCenterTF.position;
//             sceneCameraCtrl.LookAtTargetTF = m_curFieldTF;
//         }
//     }
//
//     /// <summary>
//     /// 战斗的逻辑脚本，会随着战斗退出而销毁。
//     /// 注意:
//     /// 1、同一个脚本只会挂载一个。
//     /// 2、切关会释放脚本。
//     /// </summary>
//     /// <typeparam name="T"></typeparam>
//     /// <returns></returns>
//     public T AddBattleLogicScript<T>() where T : MonoBehaviour {
//         return gameObject.AddComponentSafe<T>();
//     }
//
//     List<Puppet> Test_getBattleHeros(int fieldIdx, int needObjCount) {
//         int objCount = Mathf.Min(needObjCount, m_battleConfig.TestHeroPrefabs.Length);
//         m_heroObjs.Clear();
//         Puppet obj = null;
//         for(int i = 0; i < objCount; i++) {
//             int prefabIdx = i;
//             GameObject prefab = m_battleConfig.TestHeroPrefabs[prefabIdx];
//             if(prefab != null) {
//                 obj = ObjectManager.Share().CreateObj(ObjType.PlayerSelf, prefab, Vector3.zero, null);
//                 obj.LookAtDirImm(Vector3.left);
//                 obj.SeatID = i;
//                 m_heroObjs.Add(obj);
//                 m_heroObjsBySeat.Add(obj);
//             }
//         }
//
//         return m_heroObjs;
//     }
//
//     List<Puppet> Test_getBattleEnemys(int fieldIdx, int needObjCount) {
//         int objCount = Mathf.Min(needObjCount, m_battleConfig.TestEnemyPrefabs.Length);
//         m_enemyObjs.Clear();
//         Puppet obj = null;
//         for(int i = 0; i < objCount; i++) {
//             int prefabIdx = i;
//             GameObject prefab = m_battleConfig.TestEnemyPrefabs[prefabIdx];
//             if(prefab != null) {
//                 obj = ObjectManager.Share().CreateObj(ObjType.Monster, prefab, Vector3.zero, null);
//                 obj.LookAtDirImm(Vector3.right);
//                 obj.SeatID = 100 + i;
//                 m_enemyObjs.Add(obj);
//             }
//         }
//
//         return m_enemyObjs;
//     }
//
//     List<Puppet> GetBattleHerosFromServerData(int fieldIdx, int needObjCount) {
//         if(needObjCount <= 0) return null;
//         var heroSDatas = BattleServerData.Share().heroSDatas;
//
//         int objCount = Mathf.Min(needObjCount, heroSDatas.Count);
//         m_heroObjs.Clear();
//
//         for(int i = 0; i < objCount; i++) {
//             BattleServerData.EroicaSData heroSData = heroSDatas[i];
//             //LTHeroConfigInfo heroConfig = LTHeroController.getInstance().getHeroConfigInfo(heroSData.heroID);
//             Puppet obj = ObjectManager.Share().CreateObj(ObjType.PlayerSelf, heroConfig.prefab, Vector3.zero, ObjPrefabPathType.Role_Prefab_Path, null, false);
//             //obj.InitWithHeroServerData(heroSData, heroConfig);
//             obj.LookAtDirImm(Vector3.left);
//             //DebugUtil.LogErrorFormat("[Battle] idx:{0} puppet:{1} strHeadIcon:{2}", i, obj.GetGID(), obj.GetRawProp(PuppetStrPropID.HeadIcon));
//             m_heroObjs.Add(obj);
//             m_heroObjsBySeat.Add(obj);
//         }
//         //注：此处根据英雄站位ID排序。所有对英雄Idx的引用，从此处之后生效
//         m_heroObjsBySeat.objSeatPriorSort();
//         m_heroObjs.objHeadIconSort();
//
//         for(int i = 0; i < objCount; i++) {
//             Puppet hero = m_heroObjs[i];
//             if(hero != null) {
//                 hero.SeatID = i;
//                 setHeroDelegate(hero, i);
//                 ObjectManager.Share().AddObject(hero);
//             }
//         }
//
//         return m_heroObjs;
//     }
//
//     void setHeroDelegate(Puppet obj, int idx) {
//         obj.RegistOnAngerChange((cbObj, oldValue, newValue) => {
//             UGUIBattleForm.getInstance().SetHeroCellProgress(idx, (float)newValue / cbObj.GetPropWithBuff(PuppetIntPropID.Prop_angerMax));
//         });
//     }
//
//     List<Puppet> GetBattleEnemysFromServerData(int fieldIdx, int needObjCount) {
//         if(needObjCount <= 0) return null;
//         BattleServerData.BattleMonsterSData monsterSDatas = BattleServerData.Share().monsterSDatas;
//
//         if(fieldIdx >= monsterSDatas.monsterWaves.Count) { return null; }
//         BattleServerData.WaveInfo monsterWave = monsterSDatas.monsterWaves[fieldIdx];
//         Dictionary<int, BattleServerData.MonsterObjSData> monsterTable = monsterSDatas.monsterTable;
//
//
//         int objCount = Mathf.Min(needObjCount, monsterWave.monsterIDs.Count);
//         m_enemyObjs.Clear();
//
//         int seatCount = m_curField.enemySeatTFs.Length;
//         for(int i = 0; i < seatCount; i++) {
//             m_enemyObjs.Add(null);
//         }
//
//         for(int i = 0; i < objCount; i++) {
//             int monsterID = monsterWave.monsterIDs[i];
//             int seatID = monsterWave.seatIDs[i];
//
//             BattleServerData.MonsterObjSData monsterSData = null;
//             monsterTable.TryGetValue(monsterID, out monsterSData);
//             if(monsterSData == null) {
//                 DebugUtil.LogErrorFormat("[BattleMgr] 服务器下发的怪物表中没有找到对应怪物ID。monsterID:{0}  ", monsterID);
//                 continue;
//             }
//             ObjType objtype = (monsterSData.type == 0 ? ObjType.Monster : ObjType.Boss);
//             Puppet obj = ObjectManager.Share().CreateObj(objtype, monsterSData.prefab, Vector3.zero, ObjPrefabPathType.Enemy_Prefab_Path, null, false);
//             if(obj != null) {
//                 obj.InitWithEnemyServerData(monsterSData);
//             }
//             obj.LookAtDirImm(Vector3.right);
//
//             if(seatID >= 0 && seatID < seatCount) {
//                 obj.SeatID = seatID;
//                 m_enemyObjs[seatID] = obj;
//                 ObjectManager.Share().AddObject(obj);
//             } else {
//                 DebugUtil.LogErrorFormat("[BattleMgr] 怪物的SeatID填的不对。seatID:{0}  seatCount:{1}", seatID, seatCount);
//             }
//         }
//
//         return m_enemyObjs;
//     }
//
//     /// <summary>
//     /// 获取玩家对象列表
//     /// </summary>
//     /// <param name="fieldIdx">场ID</param>
//     /// <param name="needObjCount">限制的玩家列表数量</param>
//     /// <returns></returns>
//     List<Puppet> GetBattleHeros(int fieldIdx, int needObjCount) {
// #if UNITY_EDITOR
//         if(DebugSetting.Self.Debug_LocalScene) {
//             return Test_getBattleHeros(fieldIdx, needObjCount);
//         } else
// #endif
//         {
//             return GetBattleHerosFromServerData(fieldIdx, needObjCount);
//         }
//     }
//
//     /// <summary>
//     /// 获取敌人对象列表
//     /// </summary>
//     /// <param name="fieldIdx"></param>
//     /// <param name="needObjCount"></param>
//     /// <returns></returns>
//     List<Puppet> GetBattleEnemys(int fieldIdx, int needObjCount) {
// #if UNITY_EDITOR
//         if(DebugSetting.Self.Debug_LocalScene) {
//             return Test_getBattleEnemys(fieldIdx, needObjCount);
//         } else
// #endif
//         {
//             return GetBattleEnemysFromServerData(fieldIdx, needObjCount);
//         }
//     }
//
//     void SetupHeroObjsOnCurField() {
//         GetBattleHeros(curFieldIdx, m_curField.heroSeatTFs.Length);
//         if(m_heroObjsBySeat.Count > 0) {
//             for(int i = 0; i < m_heroObjsBySeat.Count; i++) {
//                 Puppet heroObj = m_heroObjsBySeat[i];
//                 if(heroObj != null && m_curField.heroSeatTFs[i] != null) {
//                     heroObj.objTF.position = m_curField.heroSeatTFs[i].position;
//                     heroObj.objTF.parent = BattleObjRoot;
//                 }
//             }
//         } else {
//             DebugUtil.LogErrorFormat("[BattleMgr] 英雄战斗队列是空的");
//         }
//     }
//
//     void setupEnemyObjsOnCurField() {
//         GetBattleEnemys(curFieldIdx, m_curField.enemySeatTFs.Length);
//         if(m_enemyObjs != null) {
//             for(int i = 0; i < m_enemyObjs.Count; i++) {
//                 Puppet enemyObj = m_enemyObjs[i];
//                 if(enemyObj != null && m_curField.enemySeatTFs[i] != null) {
//                     enemyObj.objTF.position = m_curField.enemySeatTFs[i].position;
//                     enemyObj.objTF.parent = BattleObjRoot;
//                 }
//             }
//         } else {
//             DebugUtil.LogErrorFormat("[BattleMgr] 怪物战斗队列是空的");
//         }
//     }
//
//     //删除死亡对象的引用
//     public void OnEnemyDead(Puppet puppet) {
//         for(int i = 0; i < m_enemyObjs.Count; i++) {
//             if(m_enemyObjs[i] != null && puppet == m_enemyObjs[i]) {
//                 m_enemyObjs[i] = null;
//             }
//         }
//     }
//
//     void setupBattleObjs() {
//         SetupHeroObjsOnCurField();
//         setupEnemyObjsOnCurField();
//     }
//
//     //激活对象，开始战斗
//     void ActiveBattleObjs() {
//         if(m_heroObjs != null) {
//             for(int i = 0; i < m_heroObjs.Count; i++) {
//                 Puppet hero = m_heroObjs[i];
//                 if(hero != null && hero.IsDead == false) {
//                     hero.ActiveObj();
//                 }
//             }
//         }
//         if(m_enemyObjs != null) {
//             for(int i = 0; i < m_enemyObjs.Count; i++) {
//                 if(m_enemyObjs[i] != null && m_enemyObjs[i].IsDead == false) {
//                     m_enemyObjs[i].ActiveObj();
//                 }
//             }
//         }
//
//     }
//     public Puppet GetHeroWithIdx(int heroIdx) {
//         if(m_heroObjs.Count <= heroIdx) {
//             return null;
//         }
//         return m_heroObjs[heroIdx];
//     }
//
//
//     void Update() {
// //         if(loadingView != null) {
// //             showLoadingProgress += 10;
// //             if(showLoadingProgress > targetLoadingProgress) showLoadingProgress = targetLoadingProgress;
// //             TTUnityPlugin.NotificationCenter.Share().PostNotification(TypeDefinition.LOAD2_PROCESS, showLoadingProgress);
// //         }
//         if(isBattleRunning == false || IsBattlePause) {
//             return;
//         }
//
//         updateFieldMoving();
//         updateField();
//         if(IsFPSMode) {
//             updateFPS();
//         }
//         updateGuidePause();
//     }
//
//
//     void updateFieldMoving() {
//         if(isCameraToNextField == false && isObjMovingToNextField == false) {
//             return;
//         }
//
//         float dt = Time.deltaTime;
//         if(isCameraToNextField) {
//             Vector3 fieldPosNext = m_curFieldTF.position;
//             if(fieldMoveInfo.ObjMoveStep(dt, fieldPosNext, out fieldPosNext)) {
//                 isCameraToNextField = false;
//             }
//             m_curFieldTF.position = fieldPosNext;
//         }
//         if(isObjMovingToNextField) {
//             bool isAllHeroStand = true;
//             for(int i = 0; i < m_heroObjs.Count; i++) {
//                 Puppet heroObj = m_heroObjs[i];
//                 if(heroObj != null) {
//                     if(heroObj.IsMoving()) {
//                         isAllHeroStand = false;
//                         break;
//                     }
//                 }
//             }
//
//             if(isAllHeroStand) {
//                 isObjMovingToNextField = false;
//             }
//         }
//         if(isCameraToNextField == false && isObjMovingToNextField == false) {
//             StartField();
//         }
//     }
//
//
//     void updateField() {
//         bool isAllHeroDead = true;
//         for(int i = 0; i < m_heroObjs.Count; i++) {
//             Puppet heroObj = m_heroObjs[i];
//             if(heroObj != null) {
//                 if(heroObj.IsDead == false) {
//                     isAllHeroDead = false;
//                     break;
//                 }
//             }
//         }
//
//         if(isAllHeroDead) {
//             fail();
//         } else {
//             if(false == tIsAllEnemyDead) {
//                 bool isAllEnemyDead = true;
//                 for(int i = 0; i < m_enemyObjs.Count; i++) {
//                     Puppet enemyObj = m_enemyObjs[i];
//                     if(enemyObj != null) {
//                         if(enemyObj.IsDeadAndRelase == false) {
//                             isAllEnemyDead = false;
//                             break;
//                         }
//                     }
//                 }
//                 tIsAllEnemyDead = isAllEnemyDead;
//                 if(tIsAllEnemyDead) {
//                     if(hasNextField()) {
//                         StartCoroutine(ProcessNextFieldBattle());
//                     } else {
//                         win();
//                     }
//                 }
//             }
//         }
//     }
//
//     float LimitTimeMax = 3f;
//
//     IEnumerator ProcessNextFieldBattle() {
//         //禁止放技能
//         isSkillEnable = false;
//         float limitTime = 0f;
//         //等待技能结束
//         float startTime = Time.unscaledTime;
//         bool isAllSkillOver = false;
//         while(isAllSkillOver == false && limitTime < LimitTimeMax) {
//             isAllSkillOver = true;
//             for(int i = 0; i < m_heroObjs.Count; i++) {
//                 Puppet heroObj = m_heroObjs[i];
//                 if(heroObj != null && heroObj.IsDead == false) {
//                     if(heroObj.IsCasting()) {
//                         isAllSkillOver = false;
//                         break;
//                     }
//                 }
//             }
//             if(isAllSkillOver == false) {
//                 limitTime += Time.deltaTime;
//                 yield return null;
//             }
//         }
//
//
//         //先等待所有英雄站立OK
//         limitTime = 0f;
//         bool isAllStand = false;
//         while(isAllStand == false && limitTime < LimitTimeMax) {
//             isAllStand = true;
//             for(int i = 0; i < m_heroObjs.Count; i++) {
//                 Puppet heroObj = m_heroObjs[i];
//                 if(heroObj != null && heroObj.IsDead == false) {
//                     if(heroObj.StateID != PuppetStateID.Stand) {
//                         isAllStand = false;
//                         heroObj.DeactiveObj();
//                         heroObj.Stand();
//                         break;
//                     }
//                 }
//             }
//             if(isAllStand == false) {
//                 limitTime += Time.deltaTime;
//                 yield return null;
//             }
//         }
//         if(isAllStand) {
//             NextFieldBattle();
//         }
//     }
//
//     bool hasNextField() {
//         return curFieldIdx + 1 < maxFieldCount;
//     }
//
//     void win() {
//         SynInfoUploader.Share().UploadAllImm();
//         StopBattle();
//         battleState = BattleState.Win;
//         DebugUtil.Log("赢啦！！！等待胜利动画结束");
//         //播放胜利动画
//         for(int i = 0; i < m_heroObjs.Count; i++) {
//             Puppet heroObj = m_heroObjs[i];
//             if(heroObj != null && heroObj.IsDead == false) {
//                 heroObj.Win();
//             }
//         }
//
//         StartCoroutine(waitWinState());
//     }
//
//     IEnumerator waitWinState() {
//         bool isCelebrationEnd = false;
//         while(false == isCelebrationEnd) {
//             isCelebrationEnd = true;
//             for(int i = 0; i < m_heroObjs.Count; i++) {
//                 Puppet heroObj = m_heroObjs[i];
//                 if(heroObj != null && heroObj.IsDead == false && heroObj.StateID == PuppetStateID.Win) {
//                     isCelebrationEnd = false;
//                     break;
//                 }
//             }
//             if(isCelebrationEnd == false) {
//                 yield return new WaitForSeconds(0.5f);
//             }
//         }
//
//         DebugUtil.Log("赢啦！！！提交服务器...");
//         BattleResultCommand cmd = new BattleResultCommand(true, GetLastTotalHP(), GetDeadHeroCount());
//         cmd.send();
//
//         //在这里挤点时间加载CG。
//         CheckBattleOverSendServer();
//     }
//
//     void fail() {
//         StopBattle();
//         isBattleRunning = false;
//         battleState = BattleState.Lose;
//         DebugUtil.Log("输啦！！！提交服务器...");
//         SynInfoUploader.Share().UploadAllImm();
//         BattleResultCommand cmd = new BattleResultCommand(false, GetLastTotalHP(), GetDeadHeroCount());
//         cmd.send();
//
//         CheckBattleOverSendServer();
//     }
//
//     void moveToNextField() {
//         DebugUtil.LogFormat("[BattleMgr] NextWaveBattle");
//         //剩余英雄移动到下一波位置
//         DebugUtil.LogFormat("[BattleMgr] Hero move to next field");
//         for(int i = 0; i < m_heroObjsBySeat.Count; i++) {
//             if(m_heroObjsBySeat[i] != null) {
//                 m_heroObjsBySeat[i].DeactiveObj();
//                 m_heroObjsBySeat[i].MoveToPosition(m_curField.heroSeatTFs[i].position);
//             }
//         }
//         //当前场中心对象带着镜头移到下一个场
//         isCameraToNextField = true;
//         isObjMovingToNextField = true;
//         lastFieldCenterPos = m_curFieldTF.position;
//         nextFieldCenterPos = m_curField.fieldCenterTF.position;
//         fieldMoveInfo.Reset();
//         fieldMoveInfo.SetMovePos(nextFieldCenterPos);
//         t_progress = 0;
//     }
//
//     public void NextFieldBattle() {
//         isSkillEnable = false;
//         ExitFPSMode();
//         StopCastEffect();
//         DebugUtil.LogFormat("[BattleMgr] 前往下一波");
//         curFieldIdx++;
//         m_curField = m_battleConfig.GetField(curFieldIdx);
//         UGUIBattleForm.getInstance().SetFightStep(CurFieldIdx + 1, maxFieldCount);
//         //UGUIBattleForm.getInstance().ClearHurtEffect();
//         moveToNextField();
//         setupEnemyObjsOnCurField();
//         setupShowEnemyHP();
//         MagicBallManager.Share().DeactiveAllMagicBall();
//     }
//
//     public void RestartBattle() {
//         int sceneID = SceneManager.Share().curSceneID;
//         int[] heroIDs = new int[m_heroObjs.Count];
//         for(int i = 0; i < m_heroObjs.Count; i++) {
//             heroIDs[i] = m_heroObjs[i].serverObjDataID;
//         }
//         BattleEnterCommand cmd = new BattleEnterCommand(sceneID, heroIDs);
//         cmd.send();
//         OnBattleExit();
//     }
//
//     void StartField() {
//         isSkillEnable = true;
//         tIsAllEnemyDead = false;
//         DebugUtil.LogFormat("[BattleMgr] 新的一波开始 fieldIdx" + CurFieldIdx);
//         ActiveBattleObjs();
//     }
//
//     public void Test_DeadAllEnemy() {
//         DebugUtil.LogFormat("[BattleMgr] Enemys Dead");
//         for(int i = 0; i < m_enemyObjs.Count; i++) {
//             if(m_enemyObjs[i] != null) m_enemyObjs[i].Dead();
//         }
//     }
//
//     public void Test_FinishBattle() {
//
//     }
//
//     void PauseOtherObj(Puppet obj) {
//         for(int i = 0; i < m_heroObjs.Count; i++) {
//             if(m_heroObjs[i] != null && m_heroObjs[i] != obj) {
//                 m_heroObjs[i].TimeFreezing();
//             }
//         }
//         for(int i = 0; i < m_enemyObjs.Count; i++) {
//             if(m_enemyObjs[i] != null && m_enemyObjs[i] != obj) {
//                 m_enemyObjs[i].TimeFreezing();
//             }
//         }
//     }
//
//     void ResumeAllObj() {
//         for(int i = 0; i < m_heroObjs.Count; i++) {
//             if(m_heroObjs[i] != null) {
//                 m_heroObjs[i].ResumeTimeFreezing();
//             }
//         }
//         for(int i = 0; i < m_enemyObjs.Count; i++) {
//             if(m_enemyObjs[i] != null) {
//                 m_enemyObjs[i].ResumeTimeFreezing();
//             }
//         }
//     }
//
//     //黑屏、短暂暂停
//     public void CastEffect(Puppet caster, SkillTL castSkill) {
//         if(IsFPSMode) { return; }
//         IsSkillEffect = true;
//         StartCoroutine(e_castEffect());
//     }
//
//     public void StopCastEffect() {
//         if(IsSkillEffect == false) return;
//         IsSkillEffect = false;
//         ResumeAllObj();
//         blackBG.SetActive(false);
//         _effectSkillCaster.SetObjCameraLayer(false);
//         objCamera.SetActive(false);
//     }
//
//     IEnumerator e_castEffect() {
//         //1.暂停其他人
//         PauseOtherObj(_effectSkillCaster);
//         //2.黑屏
//         blackBG.SetActive(true);
//         //3.单独摄像机开启
//         _effectSkillCaster.SetObjCameraLayer(true);
//         objCamera.SetActive(true);
//
//         //4.等一会
//         yield return new WaitForSeconds(SkillFreezingTime);
//
//         //5.恢复暂停、黑屏、单独摄像机
//         StopCastEffect();
//     }
//
//     public int lastBtnIdx = -1;
//     public void HeroSkillBtnCast(int btnIdx) {
//         if(isSkillEnable == false) {
//             return;
//         }
//         Puppet obj = m_heroObjs[btnIdx];
//
//         if(obj != null) {
//             //指引战斗中人物是被指引暂停。
//             if(isSkillGuideBattle && obj.IsTimeFreezing()) {
//                 obj.ResumeTimeFreezing();
//             }
//             //同一个英雄使劲点按钮不会停止。
//             if(IsSkillEffect && lastBtnIdx != btnIdx) {
//                 StopCastEffect();
//             }
//
//             lastBtnIdx = btnIdx;
//             SkillTL castSkill = obj.SkillPackage.GetActiveSkill();
//             if(obj.CastSkill(castSkill) <= SkillCheckResult.SkillRet_RunningWell) {
//                 int skillDmgType = castSkill.m_skillData.skillDmgType;
//                 if(skillDmgType == 0 || skillDmgType == 1) {
//                     DamageRecount.Share().RegistSkillDmgRecount(castSkill.SkillCastID);
//                 }
//                 _effectSkillCastID = castSkill.SkillCastID;
//                 _effectSkillCaster = obj;
//                 UGUIBattleForm.getInstance().ShowSkillIcon(obj.GetRawProp(PuppetStrPropID.HeadIcon), castSkill.m_skillData.skillName, 0);
//                 //obj.m_skillsystem.RegistCB_SkillFinished(OnSkillFinished);
//                 castSkill.RegistCB_SkillFinished(OnSkillFinished);
//                 if(castSkill.m_skillData.SkillCameraEffect) {
//                     BattleManager.Share().CastEffect(obj, castSkill);
//                 }
//             }
//         }
//     }
//
//     void OnSkillFinished(SkillTL skill) {
//         if(skill == null) { DebugUtil.LogErrorFormat("[OnSkillFinished] Skill is Null. curEffectSkillCastID:{0}", _effectSkillCastID); }
//         if(skill == null || _effectSkillCastID == skill.SkillCastID) {
//
//             if(IsSkillEffect) {
//                 StopCastEffect();
//             }
//         }
//
//         //DebugUtil.LogFormat("[OnSkillFinished] skillID:[{0}] SkillCastID:[{1}] m_caster:[{2}] skillDmgType:[{3}]", skill.SkillID, skill.SkillCastID, skill.m_caster == null ? "null" : skill.m_caster.name, skill.m_skillData.skillDmgType);
//         if(skill != null && skill.m_caster != null) {
//             int skillDmgType = skill.m_skillData.skillDmgType;
// #if UNITY_EDITOR
//             if(DebugSetting.Self.SkillDamageType > 0) {
//                 skillDmgType = DebugSetting.Self.SkillDamageType;
//             }
//
// #endif
//             int dmgValue = 0;
//             if(skillDmgType >= 0) {
//                 if(skillDmgType == 0 || skillDmgType == 1) {
//                     var dr = DamageRecount.Share().GetDRinfo(skill.SkillCastID);
//                     if(dr != null) {
//                         //Debug.LogFormat("[OnSkillFinished]AddSkillMsgData dmg:[{0}] heal:[{1}]", dr.damageTotal, dr.healthTotal);
//                         dmgValue = (int)(skillDmgType == 0 ? dr.damageTotal : dr.healthTotal);
//                     }
//                 }
//
//                 UGUIBattleForm.getInstance().AddSkillMsgData(skill.m_caster.GetRawProp(PuppetStrPropID.HeadIcon), skillDmgType, dmgValue);
//             }
//         }
//     }
//
//     public Camera getMainCamera() {
//         if(IsFPSMode) {
//             return fpsCamera;
//         } else {
//             return sceneCameraCtrl.m_camera;
//         }
//     }
//
//     SkillData fpsSkillData;
// //     GameObject m_modelPrefab;
// //     GameObject m_fpsEffectPrefab;
//     //FPS模式
//     public void StartFPSMode(Puppet caster, int skillID, uint skillCastID, SkillData skillData, float aFpsTime, float aAtkCD = 0, string aFpsBulletTag = "") {
//         if(caster == null) return;
//
//         //切换摄像机。
//         IsFPSMode = true;
//         FPSCaster = caster;
//         fpsAtkCD = aAtkCD;
//         t_fpsAtkCD = 0;
//         fpsTime = aFpsTime;
//         t_fpsTime = aFpsTime;
//         fpsBulletTag = aFpsBulletTag;
//         fpsSkillData = skillData;
//         fpsSkillID = skillID;
//         fpsSkillCastID = skillCastID;
//
//         Vector3 fpsCameraPos = caster.objTF.position;
//         //保证FPS镜头在正中间
//         fpsCameraPos.z = sceneCameraCtrl.m_camera.transform.position.z;
//         fpsCamera.transform.position = fpsCameraPos + fpsCameraOffsetPos;
//         fpsCamera.SetActive(true);
//         sceneCameraCtrl.SetActive(false);
//         //FPS参数
//         //fpsBulletTag = caster.fpsBulletTag;
//         fpsManPrefab = caster.fpsManPrefab;
//         fpsModelOffset = caster.fpsModelOffset;
//         fpsMuzzleEffectPrefab = caster.fpsMuzzleEffectPrefab;
//         fpsAttackStandAnimName = caster.fpsAttackStandAnimName;
//         fpsAttackAnimName = caster.fpsAttackAnimName;
//         fpsMaxAttackShowTime = caster.fpsMaxAttackShowTime;
//
//         //设置FPS手臂模型
//         if(m_fpsModelTF == null) {
//             GameObject m_modelPrefab = GameObjectLoader.Ins.GetPrefabObj(GameConstant.PrefabPath_Role + fpsManPrefab) as GameObject;
//             GameObject fpsModelObj = ObjectRecycler.Instance.InstantiatePrefab(m_modelPrefab, Vector3.zero, Quaternion.identity);
//             m_fpsModelTF = fpsModelObj.transform;
//         }
//         m_fpsModelTF.SetActive(true);
//         m_fpsModelTF.parent = fpsCamera.transform;
//         m_fpsModelTF.localPosition = fpsModelOffset;
//         m_fpsModelTF.localRotation = Quaternion.identity;
//         Animation fpsManAnimation = m_fpsModelTF.GetComponentInChildren<Animation>();
//         m_fpsManAnimPlayer = new AnimPlayer(fpsManAnimation);
//         m_fpsManAnimPlayer.SetupAnim(fpsAttackStandAnimName, 0, 1.0f, WrapMode.Loop);
//         m_fpsManAnimPlayer.SetupAnim(fpsAttackAnimName, 0, 1.0f, WrapMode.Loop);
//         m_fpsManAnimPlayer.PlayAnimWithFade(fpsAttackStandAnimName);
//
//         //设置FPS枪焰特效
//         if(m_fpsEffectTF == null) {
//             GameObject m_fpsEffectPrefab = GameObjectLoader.Ins.GetPrefabObj(GameConstant.PrefabPath_Effect + fpsMuzzleEffectPrefab) as GameObject;
//             GameObject fpsEffectObj = ObjectRecycler.Instance.InstantiatePrefab(m_fpsEffectPrefab, Vector3.zero, Quaternion.identity, false, true);
//             m_fpsEffectTF = fpsEffectObj.transform;
//         }
//         Transform fpsMuzzlePosTF = m_fpsModelTF.Find("pos/muzzle");
//         RelationNode relate = fpsMuzzlePosTF.GetComponent<RelationNode>();
//         if(relate != null && relate.BindTF != null) {
//             fpsMuzzlePosTF = relate.BindTF;
//         }
//         m_fpsEffectTF.parent = fpsMuzzlePosTF;
//         m_fpsEffectTF.localPosition = Vector3.zero;
//         m_fpsEffectTF.localRotation = Quaternion.identity;
//         m_fpsEffectTF.SetActive(false);
//
//         caster.m_puppetAI.Pause();
//         caster.ClearOnGuardState();
//         //caster.StopAction();
//         caster.StopMove();
//         UGUIBattleForm.getInstance().SetFPSModel(true);
//         UGUIBattleForm.getInstance().SetCrossHairState(true, Screen.width / 2, Screen.height / 2);
//         PauseBattleSpeed();
//     }
//
//     public void ExitFPSMode() {
//         if(IsFPSMode == false) return;
//         FPSCaster.m_puppetAI.Resume();
//
//         IsFPSMode = false;
//         FPSCaster = null;
//         fpsAtkCD = 0;
//         fpsTime = 0;
//         t_fpsTime = 0;
//         fpsBulletTag = "";
//         fpsCamera.SetActive(false);
//         sceneCameraCtrl.SetActive(true);
//         UGUIBattleForm.getInstance().SetFPSModel(false);
//         UGUIBattleForm.getInstance().SetCrossHairState(false);
//         ResumeBattleSpeed();
//         fpsSkillData = null;
//         //清理fps模型和枪焰特效
// //         ObjectRecycler.Instance.Deactivate(m_fpsEffectTF.gameObject, m_fpsEffectPrefab, false, true);
// //         ObjectRecycler.Instance.Deactivate(m_fpsModelTF.gameObject, m_fpsModelTF);
// //         m_fpsModelTF = null;
// //         m_fpsEffectTF = null;
//         m_fpsModelTF.SetActive(false);
//         m_fpsEffectTF.SetActive(false);
//     }
//
//     void updateFPS() {
//         float dt = Time.deltaTime;
//         if(t_fpsTime > 0) {
//             t_fpsTime -= dt;
//             if(t_fpsTime <= 0) {
//                 ExitFPSMode();
//             }
//         }
//         if(t_fpsAtkCD > 0) {
//             t_fpsAtkCD -= dt;
//         }
//         updateFPSTouch();
//         updateFPSAttackShow(dt);
//     }
//
//     public int GetLastTotalHP() {
//         int totalCurHP = 0;
//         for(int i = 0; i < m_heroObjs.Count; i++) {
//             if(m_heroObjs[i] != null) {
//                 int hp = m_heroObjs[i].GetRawProp(PuppetIntPropID.Prop_curHp);
//                 if(hp > 0) {
//                     totalCurHP += hp;
//                 }
//             }
//         }
//
//         return totalCurHP;
//     }
//
//     public int GetDeadHeroCount() {
//         int totalDeadHero = 0;
//         for(int i = 0; i < m_heroObjs.Count; i++) {
//             if(m_heroObjs[i] == null || m_heroObjs[i].IsDead) {
//                 totalDeadHero++;
//             }
//         }
//
//         return totalDeadHero;
//     }
//
//     int ATTACK_DISTANCE = 50;
//
//     void updateFPSAttackShow(float dt) {
//         if(t_fpsAttackShowTime > 0) {
//             t_fpsAttackShowTime -= dt;
//             if(t_fpsAttackShowTime <= 0) {
//                 //fps人物模型和枪焰
//                 m_fpsManAnimPlayer.PlayAnimWithFade(fpsAttackStandAnimName);
//                 m_fpsEffectTF.SetActive(false);
//             }
//         }
//     }
//
//     void updateFPSTouch() {
// #if UNITY_EDITOR || UNITY_STANDALONE_WINResetCastID
//         if(Input.GetKeyUp(KeyCode.Mouse0)) {
//             //手动点击时，没有CD
//             t_fpsAtkCD = 0;
//         }
// #else
//         if(Input.touchCount == 0) {
//             //手动点击时，没有CD
//             t_fpsAtkCD = 0;
//         }
// #endif
//
//         if(t_fpsAtkCD > 0 || IsFPSMode == false) {
//             return;
//         }
//
//         Vector3 screenPoint = GetTouchPos();
//         if(screenPoint.IsZero() == false) {
//             UGUIBattleForm.getInstance().SetCrossHairState(true, screenPoint.x, screenPoint.y);
//             ray = fpsCamera.ScreenPointToRay(screenPoint);
//             RaycastHit hitInfo;
//             int layerMask = ObjectManager.Share().GetObjCampRelationLayerMask(FPSCaster.m_objType, CampRelation.Hostile);
//             if(Physics.Raycast(ray, out hitInfo, ATTACK_DISTANCE, layerMask)) {
//                 touchHitPos = hitInfo.point;
//                 touchDamage(ObjectManager.Share().GetPuppetByCollider(hitInfo.collider), hitInfo.point);
//                 t_fpsAtkCD = fpsAtkCD;
//             }
//         }
//     }
//
//     void touchDamage(Puppet reciverObj, Vector3 hitPos) {
//         if(reciverObj == null) {
//             return;
//         }
//
//         DamageInfo info = DamageInfo.CreateDamageInfo(FPSCaster, reciverObj, fpsSkillID, fpsSkillCastID, fpsSkillData.dmgRatio, fpsSkillData.dmgAdd, fpsSkillData.crit, BattleServerData.Share().FetterAtkRate, DamageSource.Skill);
//         info.hitPoint = hitPos;
//         info.hitPointOffset = info.hitPoint - reciverObj.objTF.position;
//         info.isCanAddAnger = false;
//         for(int i = 0; i < m_buffIDs.Count; i++) {
//             int buffID = m_buffIDs[i];
//             info.buffIDs.Add(m_buffIDs[i]);
//         }
//
//         BulletEffectScript.Ins.PlayEffect(fpsBulletTag, hitPos, reciverObj);
//         reciverObj.ApplyDamage(info);
//         //fps人物模型和枪焰
//         m_fpsManAnimPlayer.PlayAnimWithFade(fpsAttackAnimName);
//         m_fpsEffectTF.SetActive(true);
//         t_fpsAttackShowTime = fpsMaxAttackShowTime;
//     }
//
//     public Vector3 GetTouchPos() {
//         Vector3 position = Vector3.zero;
//
// #if UNITY_EDITOR || UNITY_STANDALONE_WIN
//         //GetKey是HoldKey,GetKeyDown是一次按下
//         if(Input.GetKey(KeyCode.Mouse0)) {
//             position = Input.mousePosition;
//         }
// #else
//         if(Input.touchCount > 0) {
//             TouchPhase touchPhase = Input.GetTouch(0).phase;
//             if(touchPhase == TouchPhase.Began
//                     || touchPhase == TouchPhase.Stationary
//                     || touchPhase == TouchPhase.Moved
//               ) {
//                 position = Input.GetTouch(0).position;
//             }
//         }
// #endif
//         return position;
//     }
//
// //到最大值后，会从1开始。
//     public void IncBattleSpeed() {
//         SetBattleSpeed(m_battleSpeed + 1);
//     }
//
//     public void SetBattleSpeed(int speed) {
//         if(speed > MaxBattleSpeed) {
//             speed = 1;
//         }
//         m_battleSpeed = speed;
//         Time.timeScale = speed;
//         UGUIBattleForm.getInstance().SetSpeedupTimes(m_battleSpeed);
//     }
//
//     void PauseBattleSpeed() {
//         Time.timeScale = 1f;
//     }
//     void ClearBattleSpeed() {
//         Time.timeScale = 1f;
//     }
//
//     void ResumeBattleSpeed() {
//         Time.timeScale = m_battleSpeed;
//     }
//
//     public void PauseBattle() {
//         if(IsBattlePause) return;
//         IsBattlePause = true;
//         for(int i = 0; i < m_heroObjs.Count; i++) {
//             if(m_heroObjs[i] != null) {
//                 m_heroObjs[i].TimeFreezing();
//             }
//         }
//         for(int i = 0; i < m_enemyObjs.Count; i++) {
//             if(m_enemyObjs[i] != null) {
//                 m_enemyObjs[i].TimeFreezing();
//             }
//         }
//         AudioManager.Ins.PauseAllSounds();
//         PauseBattleSpeed();
//     }
//
//     public void OnDestroy() {
//         ClearBattleSpeed();
//     }
//
//     public void ResumeBattle() {
//         if(IsBattlePause == false) return;
//         IsBattlePause = false;
//         ResumeAllObj();
//         AudioManager.Ins.ResumeAllSound();
//         ResumeBattleSpeed();
//     }
//
//     public void StopBattle() {
//         ExitFPSMode();
//         StopCastEffect();
//         isBattleRunning = false;
//         for(int i = 0; i < m_heroObjs.Count; i++) {
//             if(m_heroObjs[i] != null) m_heroObjs[i].DeactiveObj();
//         }
//         for(int i = 0; i < m_enemyObjs.Count; i++) {
//             if(m_enemyObjs[i] != null) m_enemyObjs[i].DeactiveObj();
//         }
//         ClearBattleSpeed();
//     }
//
//     //为了防止战斗结束时无法弹出结算做的检测。
//     void CheckBattleOverSendServer() {
//         IsBattleOverCheck = true;
//         StartCoroutine(C_CheckBattleOverSendServer());
//     }
//
//     public void StopCheckBattleOverSendServer() {
//         IsBattleOverCheck = false;
//     }
//
//     IEnumerator C_CheckBattleOverSendServer() {
//         while(IsBattleOverCheck) {
//             yield return new WaitForSeconds(CheckBattleOverSendServerTime);
//             DebugUtil.LogFormat("[BattleMgr] Check BattleOver Send Server Again! battleState:{0} IsBattleOverCheck[{1}]", battleState.ToString(), IsBattleOverCheck);
//
//             if(IsBattleOverCheck == false) break;
//
//             if(battleState == BattleState.Win) {
//                 BattleResultCommand cmd = new BattleResultCommand(true, GetLastTotalHP(), GetDeadHeroCount());
//                 cmd.send();
//             } else if(battleState == BattleState.Lose) {
//                 BattleResultCommand cmd = new BattleResultCommand(false, GetLastTotalHP(), GetDeadHeroCount());
//                 cmd.send();
//             } else {
//                 DebugUtil.LogErrorFormat("[BattleMgr] Check BattleOver Send Server Error! Error battleState:{0}", battleState.ToString());
//             }
//         }
//     }
//
//     public void EnableBGM(bool b) {
//         AudioManager.Ins.EnableBGM(b);
//     }
//     public void EnableEffectSounds(bool b) {
//         AudioManager.Ins.EnableSounds(b);
//     }
//
//     Dictionary<GameObject, ObjectRecycler.InstantiatedPrefab> preInstantiatedObj = new Dictionary<GameObject, ObjectRecycler.InstantiatedPrefab>();
//     void addPreInstantiatedObj(GameObject obj, float count, RecycleStrategy strategy, int maxCount = 999) {
//         if(obj == null) return;
//         ObjectRecycler.InstantiatedPrefab insInfo = null;
//         if(preInstantiatedObj.TryGetValue(obj, out insInfo)) {
//             insInfo.IncInitialCount(count);
//             insInfo.SetMaxInitCount(maxCount);
//         } else {
//             preInstantiatedObj.Add(obj, new ObjectRecycler.InstantiatedPrefab(obj, count, strategy, maxCount));
//         }
//     }
//
//     void preinstantiateCollectedObjs() {
//         for(var ite = preInstantiatedObj.GetEnumerator(); ite.MoveNext();) {
//             ObjectRecycler.InstantiatedPrefab insInfo = ite.Current.Value;
//             ObjectRecycler.Instance.PreInstantiateObject(insInfo);
//         }
//     }
// /// <summary>
// /// 在服务器数据接收之后调用即可，如战斗开始前或加载的时候调用。
// ///
// /// 死亡特效
// /// 子弹碰撞特效表
// /// 技能触发器上的子弹、后续子弹、特效
// /// </summary>
//     void PreInstantiated() {
//         //计算最大怪物数量
//         int maxEffectCount = 3; //还有英雄，设置个最小数量。
//         //子弹碰撞特效表
//         //BulletEffectScript.Ins.PreInstantiate(maxEffectCount, RecycleStrategy.Visible);
//         //yield return null;
//
//         //从人物Prefab上读取加载死亡特效、技能中的子弹触发。
//         var monsterInfos = BattleServerData.Share().monsterSDatas.monsterTable;
//         for(var ite = monsterInfos.GetEnumerator(); ite.MoveNext();) {
//             string monsterPrefabName = ite.Current.Value.prefab;
//             GameObject prefabPuppet = GameObjectLoader.Ins.GetPrefabObj(monsterPrefabName, PrefabPathType.Enemy_Prefab_Path);
//             if(prefabPuppet != null) {
//                 Puppet puppet = prefabPuppet.GetComponent<Puppet>();
//                 if(puppet != null) {
//                     PreInstantiatedObjThings(puppet, false);
//                 }
//             }
//         }
//
//         var heroInfos = BattleServerData.Share().heroSDatas;
//         for(int i = 0; i < heroInfos.Count; i++) {
//             LTHeroConfigInfo heroConfig = LTHeroController.getInstance().getHeroConfigInfo(heroInfos[i].heroID);
//             string heroPrefabName = heroConfig.prefab;
//             GameObject prefabPuppet = GameObjectLoader.Ins.GetPrefabObj(heroPrefabName, PrefabPathType.Role_Prefab_Path);
//             if(prefabPuppet != null) {
//                 Puppet puppet = prefabPuppet.GetComponent<Puppet>();
//                 if(puppet != null) {
//                     PreInstantiatedObjThings(puppet, true);
//                 }
//             }
//         }
//         preinstantiateCollectedObjs();
//     }
//
//     public float BulletRecyclerFactor = 0.75f;
//     public float ParticleRecyclerFactor = 0.8f;
//
//     void PreInstantiatedObjThings(Puppet puppet, bool IsHero) {
//         //死亡特效
//
//         GameObject prefabDead = GameObjectLoader.Ins.GetPrefabObj(puppet.deadRemainsPrefab, PrefabPathType.Effect_Prefab_Path);
//         addPreInstantiatedObj(prefabDead, 1, RecycleStrategy.Visible, 3);
//
//         if(false == IsHero) { return; }
//
//         Transform skillRootTF = puppet.transform.Find("skills");
//         //技能触发器上的子弹、后续子弹、特效
//         BulletTrigger[] bulletTriggers = skillRootTF.GetComponentsInChildren<BulletTrigger>(false);
//         for(int i = 0; i < bulletTriggers.Length; i++) {
//             BulletTrigger bulletTri = bulletTriggers[i];
//             if(string.IsNullOrEmpty(bulletTri.bulletPrefab) == false) {
//                 GameObject prefabBullet = GameObjectLoader.Ins.GetPrefabObj(bulletTriggers[i].bulletPrefab, PrefabPathType.Bullet_Prefab_Path) as GameObject;
//                 if(prefabBullet != null) addPreInstantiatedObj(prefabBullet, 1 , RecycleStrategy.Visible, 3);
//             }
// //             if(string.IsNullOrEmpty(bulletTri.followUpBulletPrefab) == false) {
// //                 GameObject prefabBullet = GameObjectLoader.Ins.GetPrefabObj(bulletTriggers[i].followUpBulletPrefab, PrefabPathType.Bullet_Prefab_Path) as GameObject;
// //                 if(prefabBullet != null) addPreInstantiatedObj(prefabBullet, 1 * BulletRecyclerFactor, RecycleStrategy.Visible, 3);
// //             }
//         }
//         PlayParticleTrigger[] particleTriggers = skillRootTF.GetComponentsInChildren<PlayParticleTrigger>(false);
//         for(int i = 0; i < particleTriggers.Length; i++) {
//             if(string.IsNullOrEmpty(particleTriggers[i].particleName) == false) {
//                 GameObject prefabParticle = GameObjectLoader.Ins.GetPrefabObj(particleTriggers[i].particleName, PrefabPathType.Effect_Prefab_Path) as GameObject;
//                 if(prefabParticle != null) addPreInstantiatedObj(prefabParticle, 1 * ParticleRecyclerFactor, RecycleStrategy.Visible, 3);
//             }
//         }
//     }
//
//     void OnDrawGizmos() {
//         Gizmos.color = Color.green;
//         Gizmos.DrawRay(ray.origin, ray.direction * ATTACK_DISTANCE);
//         Gizmos.color = Color.red;
//         Gizmos.DrawLine(ray.origin, touchHitPos);
//     }
//
//
//     void mailFightReport(string reportUid) {
//         //if(GlobalData.shared().playerInfo.gmFlag == 1) {
//         //    MailFightReportCommand* cmd = new MailFightReportCommand(reportUid);
//         //    cmd->setSuccessCallback(CCCallFuncO::create(this, callfuncO_selector(BattleManager::goToBattle), NULL));
//         //    cmd->sendAndRelease();
//         //}
//     }
//
//
//     //---------------guide--------------//
//     bool isSkillGuideBattle = false;
//     public void initGuides() {
//         GuideController.share().currDilogues = null;
//         GuideController.share().isBattleGuide = true;
//         guidePauseIndex = 0;
//         int sceneId = SceneManager.Share().curSceneID;
//         string guideId = string.Empty;
//         switch(sceneId) {
//             case 7010000: guideId = "3070004";
//                 isSkillGuideBattle = true;
//                 break;
//             case 7010001: guideId = "3070030";
//                 break;
//
//         }
//         if(!string.IsNullOrEmpty(guideId)) {
//             LTPlayerPrefs.Instance.SetInt(GlobalData.shared().playerInfo.uid + "BattleGuide", 0);
//             LTPlayerPrefs.Instance.Save();
//             GuideController.share().StartBattleGuide(guideId, () => {
//                 ResumeBattle();
//                 StartCoroutine(GuideSkillRelease());
//             });
//         }
//     }
//
//     IEnumerator GuideSkillRelease() {
//         yield return new WaitForSeconds(6.5f);
//         Guide_FullAnger(0);
//         UGUIBattleForm curView = UGUIManager.GetInstance().GetGameFormScript<UGUIBattleForm>(FormID.FormID_Battle);
//         setBattleGuide(curView.cells[0].cellBtn.transform);
//     }
//
//
//     private int guidePauseIndex = 0;
//
//     void updateGuidePause() {
//         if(GuideController.share().isBattleGuide && guidePauseIndex == 0 && GuideController.share().currDilogues != null && GuideController.share().currDilogues.Count > 0) {
//             //指引关卡//
//             PauseBattle();
//             guidePauseIndex++;
//         }
//     }
//
//     //新手引导满怒需求暂停//
//     public void setBattleGuide(Transform node) {
//         if(GuideController.share().getCurrentId() == "3070004" && guidePauseIndex == 1) {
//             PauseBattle();
//             guidePauseIndex++;
//             GuidePlotView2.OpenForm(GuideController.share().currDilogues, () => {
//                 Vector3 basicPos;
//                 basicPos = UGUIManager.GetInstance().m_Camera.WorldToScreenPoint(node.position);
//                 Vector2 clickPoint;
//                 RectTransform rect = UGUIManager.GetInstance().transform as RectTransform;
//                 RectTransformUtility.ScreenPointToLocalPointInRectangle(rect, basicPos, UGUIManager.GetInstance().m_Camera, out clickPoint);
//                 RectTransform rect2 = node.getRectransform();
//                 Vector2 seizeDelta;
//                 if(rect2 != null)
//                     seizeDelta = node.getRectransform().sizeDelta;
//                 else
//                     seizeDelta = new Vector2(200, 100);
//                 GuideView.OpenForm(GuideController.share().getCurrentId(), clickPoint, seizeDelta);
//             });
//         }
//     }
//
//     public void Guide_FullAnger(int heroIdx) {
//         Puppet hero = m_heroObjs[heroIdx];
//         if(hero != null) {
//             hero.Guide_FullAnger();
//         }
//     }
// }
//
// }
